home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 1 / LSD Compendium Deluxe 1.iso / a / programming / assembly / juliasrc.lha / julia3.s < prev    next >
Encoding:
Text File  |  1993-02-28  |  7.7 KB  |  374 lines

  1. **********************************************************************
  2.         incdir    "sys:include/"
  3.         include    "exec/exec_lib.i"
  4.         include    "hardware/custom.i"
  5. **********************************************************************
  6. CALL        MACRO
  7.         jsr    _LVO\1(a6)
  8.         ENDM
  9. **********************************************************************
  10.         rsset    -4
  11. PixelMask    rs.w    1    ; mask to "OR" with bitplanes
  12. WordsInRaster    rs.w    1    ; number of words left in current raster
  13. InitialX    rs.w    1    ; inital x
  14. InitialY    rs.w    1    ; inital y
  15. LinesLeft    rs.w    1    ; number of lines left to draw
  16. CycleSpeed    rs.w    1    ; number of vblanks between each cycle
  17. CyclePointer    rs.l    1    ; pointer for use by cycle interrupt
  18. OldLev3        rs.l    1    ; level 3 autovector interrupt
  19. IntenaSave    rs.w    1    ; interrupt bits
  20. **********************************************************************
  21.         movea.l    4.w,a6
  22.         bra.b    BootBlock+12
  23.  
  24. BootBlock:    dc.b    "DOS",0
  25.         dc.l    "CKSM"
  26.         dc.l    $00000370
  27.  
  28.         movem.l    d1-d7/a0-a6,-(a7)
  29.  
  30.         moveq    #1,d0
  31.         swap    d0            ; 64k
  32.         moveq    #2,d1
  33.         CALL    AllocMem
  34.         tst.l    d0
  35.         beq.w    NoMem
  36.  
  37.         move.l    d0,-(a7)
  38.  
  39.         CALL    Forbid
  40.         CALL    Disable
  41.         lea    $dff000,a4
  42.         bsr.w    WaitVBlank
  43.         movea.l    (a7),a5
  44.         adda.l    #256*40*5,a5
  45.         move.l    a5,cop2lc(a4)
  46.         clr.w    copjmp2(a4)
  47.         move.w    #$07e0,dmacon(a4)
  48.         move.w    #$8240,dmacon(a4)
  49.  
  50.         lea    Copper(pc),a6
  51.         moveq    #((Palette-Copper)/4)-1,d7
  52. L2        move.l    (a6)+,(a5)+
  53.         dbf    d7,L2
  54.  
  55.         lea    2(a5),a3        ; save pointer to first color
  56.  
  57.         move.w    #$0180,d0        ; color 0
  58.         moveq    #31,d7
  59. L3        move.w    d0,(a5)+
  60.         move.w    (a6)+,(a5)+
  61.         addq.w    #2,d0
  62.         dbf    d7,L3
  63.  
  64.         move.w    #$00e2,d0        ; init bitplane pointers
  65.         move.l    (a7),d1
  66.         moveq    #8,d7
  67. L4        move.w    d0,(a5)+        ; low word first
  68.         subq.w    #2,d0        
  69.         move.w    d1,(a5)+
  70.         move.w    d0,(a5)+
  71.         addq.w    #6,d0
  72.         swap    d1
  73.         move.w    d1,(a5)+
  74.         swap    d1
  75.         addi.l    #256*40,d1
  76.         subq.l    #2,d7
  77.         bpl.b    L4
  78.  
  79.         move.l    d7,(a5)+        ; $fffffffe
  80.  
  81.         move.l    #$80000014,(a5)+    ; mask & word per raster count
  82.  
  83.         move.l    a3,CyclePointer(a5)
  84.         move.w    #5,CycleSpeed(a5)
  85.  
  86.         move.l    $6c.w,OldLev3(a5)
  87.         lea    CycleIRQ(pc),a0
  88.         move.l    a0,$6c.w
  89.  
  90.         move.w    intenar(a4),d0
  91.         move.w    d0,IntenaSave(a5)
  92.         move.w    #$7fff,intena(a4)
  93.         move.w    #$c020,intena(a4)
  94.  
  95. StartJulia:    movea.l    (a7),a0            ; get pointer to bitplanes
  96. .1        btst.b    #6,dmaconr(a4)
  97.         bne.b    .1
  98.         move.l    a0,bltdpt(a4)
  99.         move.l    #$01000000,bltcon0(a4)
  100.         clr.w    bltdmod(a4)
  101.         move.w    #(640*64)+40,bltsize(a4)
  102.  
  103.         move.l    (a6)+,(a5)
  104.         bne.b    NoReset
  105.         lea    JuliaData(pc),a6
  106.         move.l    (a6)+,(a5)
  107.  
  108. NoReset:    lea    Plot00+2(pc),a1
  109.         move.w    (a5),(RasterInit-Plot00)(a1)    ; initial m
  110.         move.w    (a6),(a1)            ; pixel step
  111.         move.w    (a6)+,(RasterAdd-Plot00)(a1)    ; raster step
  112.         move.l    (a6)+,(BootBlock-(Plot00+2))(a1)  ; initial c1 and c2
  113.         move.l    a6,((BootBlock+4)-(Plot00+2))(a1) ; save julia pointer
  114.         move.w    #256,LinesLeft(a5)        ; vertical height
  115.         lea    256*40(a0),a1
  116.         lea    256*40(a1),a2
  117.         lea    256*40(a2),a3
  118.         lea    $04000000,a6        ; for magnitude test
  119.  
  120. .1        btst.b    #6,dmaconr(a4)
  121.         bne.b    .1
  122.  
  123.         bsr.w    WaitVBlank
  124.         move.w    #$8380,dmacon(a4)
  125.         lea    256*40(a3),a4
  126.  
  127. PixelLoop:    move.w    (a5),d1            ; inital x
  128.         move.w    InitialY(a5),d0        ; inital y
  129.         moveq    #30,d7
  130.         movem.w    BootBlock(pc),d4-d5    ; initial c1 and c2
  131.         move.w    d0,d2
  132.         move.w    d1,d3
  133.         bra.b    CheckMagnitude
  134.  
  135. IterateJulia:    sub.l    d3,d2        ; x^2 - y^2
  136.         lsl.l    #4,d2        ; fix decimal point
  137.         swap    d2        ; ...
  138.         add.w    d4,d2        ; x1 = x^2 - y^2 + c1
  139.  
  140.         move.w    d1,d3        ; y
  141.         muls    d0,d3        ; x * y
  142.         lsl.l    #5,d3        ; fix decimal point and multiply by 2
  143.         swap    d3        ; ...
  144.         add.w    d5,d3        ; y1 = 2 * x * y + c2
  145.  
  146.         move.w    d2,d0        ; x = x1
  147.         move.w    d3,d1        ; y = y1
  148.  
  149. CheckMagnitude:    muls    d2,d2        ; x^2
  150.         muls    d3,d3        ; y^2
  151.         move.l    d2,d6
  152.         add.l    d3,d6        ; z = x^2 + y^2
  153.         cmp.l    a6,d6        ; escaped yet?
  154.         dbhi    d7,IterateJulia
  155.         move.w    PixelMask(a5),d6
  156.         moveq    #0,d5
  157.         move.b    JumpTable+1(pc,d7.w),d5
  158.         jmp    JumpTable(pc,d5.w)
  159.  
  160. JumpTable:    dc.b    Plot00-JumpTable,Plot31-JumpTable
  161.         dc.b    Plot30-JumpTable,Plot29-JumpTable
  162.         dc.b    Plot28-JumpTable,Plot27-JumpTable
  163.         dc.b    Plot26-JumpTable,Plot25-JumpTable
  164.         dc.b    Plot24-JumpTable,Plot23-JumpTable
  165.         dc.b    Plot22-JumpTable,Plot21-JumpTable
  166.         dc.b    Plot20-JumpTable,Plot19-JumpTable
  167.         dc.b    Plot18-JumpTable,Plot01-JumpTable
  168.         dc.b    Plot16-JumpTable,Plot15-JumpTable
  169.         dc.b    Plot14-JumpTable,Plot13-JumpTable
  170.         dc.b    Plot12-JumpTable,Plot11-JumpTable
  171.         dc.b    Plot10-JumpTable,Plot09-JumpTable
  172.         dc.b    Plot08-JumpTable,Plot07-JumpTable
  173.         dc.b    Plot06-JumpTable,Plot05-JumpTable
  174.         dc.b    Plot04-JumpTable,Plot03-JumpTable
  175.         dc.b    Plot02-JumpTable,Plot17-JumpTable
  176.  
  177. Plot22:        or.w    d6,(a4)
  178.         or.w    d6,(a2)
  179.         or.w    d6,(a1)
  180.         bra.b    Plot00
  181.  
  182. Plot21:        or.w    d6,(a4)
  183.         or.w    d6,(a2)
  184.         or.w    d6,(a0)
  185.         bra.b    Plot00
  186.  
  187. Plot20:        or.w    d6,(a4)
  188.         or.w    d6,(a2)
  189.         bra.b    Plot00
  190.  
  191. Plot18:        or.w    d6,(a4)
  192.         or.w    d6,(a1)
  193.         bra.b    Plot00
  194.  
  195. Plot26:        or.w    d6,(a4)
  196. Plot10:        or.w    d6,(a3)
  197.         or.w    d6,(a1)
  198.         bra.b    Plot00
  199.  
  200. Plot23:        or.w    d6,(a4)
  201.         or.w    d6,(a2)
  202.         or.w    d6,(a1)
  203.         or.w    d6,(a0)
  204.         bra.b    Plot00
  205.  
  206. Plot19:        or.w    d6,(a4)
  207.         or.w    d6,(a1)
  208.         or.w    d6,(a0)
  209.         bra.b    Plot00
  210.  
  211. Plot27:        or.w    d6,(a4)
  212. Plot11:        or.w    d6,(a3)
  213.         or.w    d6,(a1)
  214.         or.w    d6,(a0)
  215.         bra.b    Plot00
  216.  
  217. Plot17:        or.w    d6,(a4)
  218.         or.w    d6,(a0)
  219.         bra.b    Plot00
  220.  
  221. Plot25:        or.w    d6,(a4)
  222. Plot09:        or.w    d6,(a3)
  223.         or.w    d6,(a0)
  224.         bra.b    Plot00
  225.  
  226. Plot29:        or.w    d6,(a4)
  227. Plot13:        or.w    d6,(a3)
  228. Plot05:        or.w    d6,(a2)
  229.         or.w    d6,(a0)
  230.         bra.b    Plot00
  231.  
  232. Plot16:        or.w    d6,(a4)
  233.         bra.b    Plot00
  234.  
  235. Plot24:        or.w    d6,(a4)
  236. Plot08:        or.w    d6,(a3)
  237.         bra.b    Plot00
  238.  
  239. Plot28:        or.w    d6,(a4)
  240. Plot12:        or.w    d6,(a3)
  241. Plot04:        or.w    d6,(a2)
  242.         bra.b    Plot00
  243.  
  244. Plot30:        or.w    d6,(a4)
  245. Plot14:        or.w    d6,(a3)
  246. Plot06:        or.w    d6,(a2)
  247. Plot02:        or.w    d6,(a1)
  248.         bra.b    Plot00
  249.  
  250. Plot31:        or.w    d6,(a4)
  251. Plot15:        or.w    d6,(a3)
  252. Plot07:        or.w    d6,(a2)
  253. Plot03:        or.w    d6,(a1)
  254. Plot01:        or.w    d6,(a0)
  255. Plot00:        addi.w    #$0000,(a5)        ; pixel "step"
  256.         ror.w    PixelMask(a5)        ; shift mask over
  257.         bpl.w    PixelLoop
  258.  
  259.         addq.w    #2,a0
  260.         addq.w    #2,a1
  261.         addq.w    #2,a2
  262.         addq.w    #2,a3
  263.         addq.w    #2,a4
  264.         subq.w    #1,WordsInRaster(a5)    ; subtract from word counter
  265.         bne.w    PixelLoop
  266.  
  267.         btst.b    #6,$bfe001
  268.         bne.b    .notLMB
  269.         btst.b    #2,$dff016
  270.         beq.b    Exit
  271.  
  272. .notLMB        move.w    #320/16,WordsInRaster(a5)    ; words per raster
  273.         btst.b    #2,$dff016            ; new julia?
  274.         beq.b    NewJulia
  275.  
  276. RasterInit:    move.w    #$0000,(a5)        ; inital M value
  277. RasterAdd:    addi.w    #$0000,InitialY(a5)    ; raster "step"
  278.         subq.w    #1,LinesLeft(a5)
  279.         bne.w    PixelLoop
  280.  
  281. WaitMouse:    btst.b    #2,$dff016
  282.         bne.b    WaitMouse
  283.         btst.b    #6,$bfe001
  284.         beq.b    Exit
  285.  
  286. NewJulia:    movea.l    BootBlock+4(pc),a6
  287.         lea    $dff000,a4
  288. .waitRMBup    btst.b    #2,$0016(a4)
  289.         beq.b    .waitRMBup
  290.         bra.w    StartJulia
  291.  
  292. Exit:        lea    $dff000,a4
  293.         bsr.b    WaitVBlank
  294.         clr.w    $0100(a4)
  295.  
  296.         move.w    #$7fff,intena(a4)
  297.  
  298.         move.l    OldLev3(a5),$6c.w
  299.  
  300.         move.w    IntenaSave(a5),d0
  301.         ori.w    #$8000,d0
  302.         move.w    d0,intena(a4)
  303.  
  304.         move.l    (a7)+,a1
  305.         moveq    #1,d0
  306.         swap    d0
  307.         movea.l    4.w,a6
  308.         CALL    FreeMem
  309.  
  310. NoMem:        movem.l    (a7)+,d1-d7/a0-a6
  311.         CALL    Enable
  312.         CALL    Permit
  313.         lea    DosName(pc),a1
  314.         CALL    FindResident
  315.         movea.l    d0,a0
  316.         movea.l    $16(a0),a0
  317.         moveq    #0,d0
  318.         rts    
  319.  
  320. WaitVBlank:    btst.b    #0,5(a4)
  321.         bne.b    WaitVBlank
  322. .1        btst.b    #0,5(a4)
  323.         beq.b    .1
  324.         rts    
  325.  
  326. CycleIRQ:    btst.b    #6,$bfe001
  327.         bne.b    .nochange
  328.  
  329.         subq.w    #1,CycleSpeed(a5)
  330.         bgt.b    .nochange
  331.  
  332.         move.w    #5,CycleSpeed(a5)
  333.  
  334.         movem.l    d0-d1/a0,-(a7)
  335.  
  336.         move.l    CyclePointer(a5),a0
  337.         move.w    (a0),d0            ; save value for "wraparound"
  338.         moveq    #30,d1            ; 31 times
  339. .loop        move.w    4(a0),(a0)
  340.         addq.w    #4,a0
  341.         dbf    d1,.loop
  342.         move.w    d0,(a0)
  343.  
  344.         movem.l    (a7)+,d0-d1/a0
  345.  
  346. .nochange    move.w    #$0020,$dff09c
  347.         rte
  348.  
  349. Copper:        dc.l    $01005200,$01020000,$01080000
  350.         dc.l    $008e2981,$009029c1
  351.         dc.l    $00920038,$009400d0
  352.  
  353. Palette:    dc.w    $0000,$0831,$000e,$000d,$000c,$000b,$000a,$0009
  354.         dc.w    $0008,$0007,$0106,$0205,$0304,$0403,$0502,$0611
  355.         dc.w    $0720,$0fff,$0942,$0a53,$0b64,$0c75,$0d86,$0c97
  356.         dc.w    $0ba8,$0a9a,$098b,$0879,$0767,$0555,$0343,$0131
  357.  
  358. JuliaData:    dc.l    $f800eb00
  359.         dc.w    $0018,$0100,$0ad0,$ec00
  360.         dc.l    $ef000010
  361.         dc.w    $0600,$0100,$f226,$fd56
  362.         dc.l    $0015ee00
  363.         dc.w    $fb40,$ede2,$f0b2,$001d
  364.         dc.l    $05c0ff00
  365.         dc.w    $ef12,$e812,$001d,$f320
  366.         dc.l    $fd21eeae
  367.         dc.w    $0225,$000d,$f420,$fd43
  368.         dc.l    $00000000
  369.  
  370. DosName:    dc.b    'dos.library',0
  371.  
  372. BootLen        equ    *-BootBlock
  373.  
  374.